package com.example.springboot.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.springboot.entity.User;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;

@Slf4j
public class TokenUtil {

    /**
     *  客户端过期时间5分钟
     */
    private static final long EXPIRE_TIME = 5 * 60 *1000;
    /**
     * 服务端过期时间30分钟
     */
    public static final long REFRESH_EXPIRE_TIME = 30 * 60 * 1000;

    /**
     * 生成秘钥token
     * @param user
     * @return
     */
    public static String getToken(User user) {
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        // 使用用户的密码做秘钥
        Algorithm algorithm = Algorithm.HMAC256(user.getPassword());
        // 生成token
        String token = JWT.create().withAudience(user.getUsername())// 将 userName 保存到 token 里面
                .withExpiresAt(date)
                .withClaim("password", user.getPassword())
                .sign(algorithm);// 以 password 作为 token 的密钥
        return token;
    }

    /**
     * 生成更新秘钥 refreshToken
     * @param user
     * @return
     */
    public static String getRefreshToken(User user){
        Date date = new Date(System.currentTimeMillis() + REFRESH_EXPIRE_TIME);
        // 使用用户的密码做秘钥
        Algorithm algorithm = Algorithm.HMAC256(user.getPassword());
        // 生成token
        String token = JWT.create().withAudience(user.getUsername())// 将 userName 保存到 token 里面
                .withExpiresAt(date)
                .withClaim("password", user.getPassword())
                .sign(algorithm);// 以 password 作为 token 的密钥
        return token;
    }

    /**
     * token获取用户名
     * @param token
     * @return
     */
    public static String getUsername(String token){
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getAudience().get(0);
        }catch (Exception e){
            log.error("token获取用户名异常", e);
            return null;
        }
    }

    /**
     * token获取密码
     * @param token
     * @return
     */
    public static String getPassword(String token){
        try {
            DecodedJWT jwt = JWT.decode(token);
            Claim password = jwt.getClaim("password");
            return password.asString();
        }catch (Exception e){
            log.error("token获取密码异常", e);
            return null;
        }
    }

    /**
     * 校验token是否正确
     * @param token 秘钥
     * @param userName 用户名
     * @param secret 用户密码
     * @return
     */
    public static boolean verify(String token, String userName, String secret){
        try {
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withAudience(userName)
                    .build();
            DecodedJWT verify = verifier.verify(token);
            return true;
        }catch (Exception e){
            log.error("token校验异常", e);
            return false;
        }
    }

}
